/*
 * @Author: ljkt
 * @Version: 2.0
 * @Date: 2022-05-16 11:06:33
 * @LastEditors: ljkt
 * @LastEditTime: 2025-01-26 19:34:06
 * @Description: SH79F2603 Flash操作硬件抽象层实现
 * 提供Flash的读、写、擦除等基本操作接口
 * 所有操作都通过SET_GLOBAL_IE宏来保护中断状态
 */
#include "./Hal/MCU_BF7612DM/Hal_Common_Func.h"
#if defined(EN_IAP_E2PROM) || defined(EN_IAP_FLASH)

/**
 * @brief 向Flash写入一个字节
 * @param addr 目标地址（16位）
 * @param data_in 要写入的数据（8位）
 * @note 操作期间会关闭全局中断，操作完成后恢复
 * @warning 地址必须对齐，且不能超出Flash范围
 */
void Hal_Iap_Write_OneByte(unsigned short addr, unsigned char data_in)
{
	// 关闭全局中断，确保操作原子性
	SET_GLOBAL_IE(REF_FALSE);

#ifdef EN_IAP_E2PROM
	// EEPROM写入实现（待实现）
#endif

#ifdef EN_IAP_FLASH
	// Flash写入实现（待实现）
#endif

	// 恢复全局中断
	SET_GLOBAL_IE(REF_TRUE);
}

/**
 * @brief 从Flash读取一个字节
 * @param addr 目标地址（16位）
 * @return 读取到的数据（8位）
 * @note 操作期间会关闭全局中断，操作完成后恢复
 * @warning 地址必须对齐，且不能超出Flash范围
 */
unsigned char Hal_Iap_Read_OneByte(unsigned short addr)
{
	unsigned char data = 0;

	// 关闭全局中断，确保操作原子性
	SET_GLOBAL_IE(REF_FALSE);

#ifdef EN_IAP_E2PROM
	// EEPROM读取实现（待实现）
#endif

#ifdef EN_IAP_FLASH
	// Flash读取实现（待实现）
#endif

	// 恢复全局中断
	SET_GLOBAL_IE(REF_TRUE);

	return data;
}

/**
 * @brief 擦除Flash的一个页
 * @param addr 目标地址（16位）
 * @note 操作期间会关闭全局中断，操作完成后恢复
 * @warning 地址必须对齐到页边界，且不能超出Flash范围
 * @attention 擦除操作会将整个页置为1（0xFF）
 */
void Hal_Iap_Erase_OnePage(unsigned short addr)
{
	// 关闭全局中断，确保操作原子性
	SET_GLOBAL_IE(REF_FALSE);

#ifdef EN_IAP_E2PROM
	// EEPROM擦除实现（待实现）
#endif

#ifdef EN_IAP_FLASH
	// Flash擦除实现（待实现）
#endif

	// 恢复全局中断
	SET_GLOBAL_IE(REF_TRUE);
}
#endif
